package com.yupi.example.consumer;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.yupi.example.common.model.User;
import com.yupi.example.common.service.UserService;
import com.yupi.yurpc.model.RpcRequest;
import com.yupi.yurpc.model.RpcResponse;
import com.yupi.yurpc.serializer.JdkSerializer;
import com.yupi.yurpc.serializer.Serializer;
import java.io.IOException;

/**
 * @program: yu-rpc
 * @description: Java Lotus
 * @author: spring
 * @create: 2024-10-23
 * 静态代理
 */

/*
只不过实现 getUser 方法时，不是复制粘贴服务提供者 UserServiceImpl 中的代码，
而是要构造 HTTP 请求去调用服务提供者。
 */
//对于服务类型的相关的代理类
public class UserServiceProxy implements UserService {

    //获取对象
    public User getUser(User user) {

        //选择序列化的相关的方法
        Serializer serializer = new JdkSerializer();

        //构建远程的链接，发送相关的请求
        RpcRequest rpcRequest = RpcRequest.builder()
                .serviceName(UserService.class.getName())
                .methodName("getUser")
                .parameterTypes(new Class[]{User.class})
                .args(new Object[]{user})
                .build();

        //拦截异常
        try {

            //序列化
            byte[] bodyBytes = serializer.serializer(rpcRequest);
            byte[] result;

            //获取 PORT 端口，产生相关的响应
            try (HttpResponse httpResponse = HttpRequest.post("http://localhost:8080")
                    .body(bodyBytes)
                    .execute()) {
                result = httpResponse.bodyBytes();
            }

            //动态代理的方式进行远程的调用
            RpcResponse rpcResponse = serializer.deserializer(result, RpcResponse.class);
            return (User) rpcResponse.getData(); //返回代理对象

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
